<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <img src="" alt="">
</body>
<script>
    var str = "hello";
    var stt = str.toUpperCase();
    console.log(stt); //"HELLO"

    var num1 = 123.45678;
    var num2 = num1.toFixed(2);
    console.log(num2); //123.45

    var flag = true;
    var sign = flag.toString();
    console.log(sign, typeof sign); //true,string

    // 临时包装对象
    var str = "hello";
    str.charAt(0); //创建包装对象
    // 不是同一个包装对象
    str.name = "STRING"; //创建包装对象
    // 上面代码运行完毕,包装对象销毁
    console.log(str.name); //创建包装对象
    // 上面代码运行完毕,包装对象销毁

    /**引用str字符串的属性和方法，JavaScript就会将字符串值通过调用 new String(str)的方式转换为对象，
     * 这个对象继承了字符串的方法，并被用来处理属性的引用。
     * 一旦属性引用结束，这个创建的对象就会销毁。
    */

    // 数字、布尔、字符串等基本数据类型都有对应的包装对象类型
    // 例：new Number(20)； new String('SomeStr'); //装箱
    // 存储或读取基本类型（字符串、数字、布尔）值的属性时，会创建临时包装对象
    //  例: console.log('Hello，World'.length);
    // 基本类型其属性不能被改变、添加或删除（原始值不可变性）

    // 临时对象在使用之后立即释放例：
    var str="test";       
    str.p = 4;//设置临时对象属性         
    var t = str.p; // 临时对象已释放，再输出t时为undefined
    console.log(t); //undefined;
    
    var s = str.charAt(0); //str.charAt(0)会有返回值
    s; //t

    // 数据类型转换
    // unfefined 表示“没有值”（既不是原始值也不是对象）。
    // 访问未初始化的变量、缺失的参数，以及缺失的属性会返回这个。函数中没有任何返回值时也会返回undefined
    // null表示“没有对象”。在用到对象的时候他表示空值。
    // null是原型链最顶端的元素，一切皆源于空。

    // Number类型的值-整数与浮点数 + NaN、Infinity、-Infinity、+0、-0
    // String类型的值- 空字符、字符和字符串、转义字符
    // Boolean类型的值- true、false
    // Null与Undefined- null、undefined

    var num1 = new Number(2);
    var num2 = 2;
    var num3 = new Number(2);
    console.log(num1==num2); //t
    console.log(num1===num2);//f

    console.log(num1==num3);//f
    console.log(num1===num3);//f

    var a = "2";
    var b = Number(a);
    var c = new Number(a);
    console.log(typeof b); //number
    console.log(typeof c);//object

    var a = "2.12345";
    var b = Number(a);
    var c = new Number(a);
    b = b.toFixed(2);
    typeof b; //string
    console.log(b) //2.12
    console.log(a) //2.12345
    c = c.toFixed(2); 
    console.log(c) //2.12
    console.log(a); //2.12345

    // 认识NaN和isNaN()
    window.isNaN();
    // true
    Number.isNaN(); 
    // false
    // Array.isArray();  ()里面是判断的对象
    // false
    console.log(typeof NaN); //number
    console.log(NaN == NaN); //false
    console.log(isNaN("123.4a"));//true
    // 基本数据类型比较只有NaN特殊 不相等 其他自己==自己相等
    // undefined == undefined--->true; 
    // NaN == NaN--->false
    // NaN转换为布尔类型为false：
    // undefined ->NaN(null -> 0 )
    // NaN - “1” 是 NaN
    // NaN + "1" 是NaN1

    //隐式转换
    var a = 2;
    var b = "3";
    var c = a + b; 
    console.log(c, typeof c); //23 string

    var a = 2;
    var b = String(a);
    console.log(a, typeof a); //2 'number'
    console.log(b, typeof b); //2 string

    //隐式转换 向数字类型转换
    console.log(1 + true); //2 true->1 false->0
    console.log(1 + undefined); // NaN undefined->NaN
    console.log(1 + null); //1 null->0
    console.log(1 * "123.4"); //123.4 
    console.log(1 * "123.4abc"); //NaN
    console.log("2" > 10); //false
    console.log(NaN == NaN); //false

    //选择题
    var a; //undefined
    if (a == a) { //undefined == undefined ->true
        console.log(a + "1"); // undefined1
    } else {
        console.log(a - "1");
    }

    //思考：若第一行给a赋值NaN，输出结果又会是什么？ 
    var a = NaN;  
    if (a == a) { //NaN == NaN ->false
        console.log(a + "1"); 
    } else {
        console.log(a - "1"); //NaN
        console.log(typeof (a - "1")); //number
    }

    //字符串(+左右两边只要有一个字符串就会转换成字符型拼接)
    var a = 1;
    var b = "2";
    var c = 3;
    console.log(a + b + c); //123
    console.log(a + c + b); //42
    console.log(b + c + a); //231
    // 通过字符串拼接实现图片自动播放
    var img = document.getElementsByTagName('img')[0];
    var index = 1;
    setInterval(function () {
        //补全代码
        if(index != 5){
            index += 1; 
        }else{
            index = 1;
        }
        img.src = "images/img_"+index+".jpg";

        //也可用取模的方式实现
        // index = index%5;
        // index+=1;
        // img.src = "images/img_"+index+".jpg";
    }, 1500);

    // 向布尔类型转换
    if(undefined){
        console.log("undefined转换为true")
    }else{
        console.log("undefined转换为false")
    }
    // undefined转换为false
    if(""){
        console.log("转换为true")
    }else{
        console.log("转换为false")
    }
    // ""转换为false
    // false、0、""、null、undefined 和 NaN 转换为Boolean为false;
    // 任何对象转换成布尔类型都是true; (Obj存在true) 

    // 真值指的是在强制转换布尔值时，转换后的值为真的值
    // 除 false、0、""、null、undefined 和 NaN 以外皆为真值
    var a;
    console.log(a + 1); //NaN  ->NaN
    console.log(!a + 1); //2 (!a->(!undefined)->(!false)->true->1,1+1=2)
    console.log(!!a + 1); //1

    var a; //undefined
    var b = a * 0; //NaN
    if (b == b) { //false
        console.log(b * 2 + "2" - 0 + 4);
    } else {
        console.log(!b * 2 + "2" - 0 + 4); //26(1*2 + "2" -0 +4 -> "22" - 0 +4 ->22+4->26)
    }

    var a;
    var b = a + "0";
    console.log(b) //undefined0
    if (b == b) { //undefined0 == undefined0 true
        console.log(b*2 + "2"); //NaN2
        console.log(b * 2 + "2" - 0 + 4); //NaN
    } else {
        console.log(!b * 2 + "2" - 0 + 4);
    }
          
    // 引用数据类型转换成基本数据类型比较是否相等
    var a = new Number(2)
    var b = 2;
    console.log(a == b); //t

</script>
</html>